package model

import business.AutoMoveable
import business.Destructible
import enums.Direction
import org.itheima.kotlin.game.core.Composer
import java.util.*

/**
 * 敌方坦克
 *
 * 自动移动的能力
 * */
abstract  class EnemyTank(override var x: Int, override var y: Int) :Tank(x,y),AutoMoveable,Destructible {

    override var currentDirection: Direction=Direction.DOWN
    override val speed: Int=8

    /** 最后一次射击的时间*/
    var lastShotTime=0L
    /** 最后一次移动的时间*/
    var lastMoveTime=0L
    /** 最小射击冷却时间*/
    var minCooldownTime:Long = 1000
    /** 最大射击冷却时间*/
    var maxCooldownTime:Long = 3000
    /** 射击冷却时间*/
    var shotCooldownTime=2000
    /** 移动冷却时间*/
    var moveCooldownTime=80

    override fun move(direction: Direction) {
        if(drawCount<4){
            return
        }

        if(this.currentDirection!=direction){ //移动方向与当前方向不同，那么此次移动只改变方向
            this.currentDirection=direction
            return
        }

        if(badDirection==currentDirection){ //将要发生碰撞与当前方向相同
            //改变运动方向
            currentDirection=getDirection()
            return
        }
        //现在移动速度
        var currentTime=System.currentTimeMillis()
        if(currentTime-lastMoveTime<moveCooldownTime){
            return
        }
        lastMoveTime=currentTime

        when(currentDirection){
            Direction.UP->y-=speed
            Direction.DOWN->y+=speed
            Direction.LEFT->x-=speed
            Direction.RIGHT->x+=speed
        }

        /** 越界判断 */
        if(x<0) x=0
        if(GameConfig.WINDOW_WIDTH-this.width<x) x=GameConfig.WINDOW_WIDTH-this.width
        if(y<0) y=0
        if(GameConfig.WINDOW_HEIGHT-this.height<y) y=GameConfig.WINDOW_HEIGHT-this.height
    }

    fun getDirection():Direction{
        /** [0 - 4) 随机数*/
        var num= Random().nextInt(4)
        var direction=when(num){
            0->Direction.UP
            1->Direction.DOWN
            2->Direction.LEFT
            3->Direction.RIGHT
            else->Direction.UP
        }

        if((direction==badDirection)){
            return getDirection()
        }

        return direction
    }

    override fun shot(gradle:Int): Bullet? {

        var currentTime=System.currentTimeMillis()
        if(currentTime-lastShotTime<shotCooldownTime){
            return null
        }
        lastShotTime=currentTime

        /** 重置射击冷却时间 1000-3000 之间随机数 */
        shotCooldownTime= (Math.random()*(maxCooldownTime-minCooldownTime)+minCooldownTime).toInt()
//        println("shotcCooldownTime=$shotcCooldownTime")
        return super.shot(gradle)
    }

    override fun destory():IView {
        //播放爆炸的声音
        Composer.play("snd/blast.wav")
        pool=0

        return Blast(x,y)
    }
}